home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / lib / rcscripts / awk / cachedepends.awk next >
Text File  |  2006-04-25  |  5KB  |  213 lines

  1. # Copyright 1999-2004 Gentoo Foundation
  2. # Distributed under the terms of the GNU General Public License v2
  3. # $Header$
  4.  
  5. function print_start() {
  6.     print "source /sbin/functions.sh" >> TMPCACHE
  7.     print "" >> TMPCACHE
  8.     print "need() {" >> TMPCACHE
  9.     print "    echo \"NEED $*\"; return 0" >> TMPCACHE
  10.     print "}" >> TMPCACHE
  11.     print "" >> TMPCACHE
  12.     print "use() {" >> TMPCACHE
  13.     print "    echo \"USE $*\"; return 0" >> TMPCACHE
  14.     print "}" >> TMPCACHE
  15.     print "" >> TMPCACHE
  16.     print "before() {" >> TMPCACHE
  17.     print "    echo \"BEFORE $*\"; return 0" >> TMPCACHE
  18.     print "}" >> TMPCACHE
  19.     print "" >> TMPCACHE
  20.     print "after() {" >> TMPCACHE
  21.     print "    echo \"AFTER $*\"; return 0" >> TMPCACHE
  22.     print "}" >> TMPCACHE
  23.     print "" >> TMPCACHE
  24.     print "provide() {" >> TMPCACHE
  25.     print "    echo \"PROVIDE $*\"; return 0" >> TMPCACHE
  26.     print "}" >> TMPCACHE
  27.     print "" >> TMPCACHE
  28.     print "parallel() {" >> TMPCACHE
  29.     print "    echo \"PARALLEL $*\"; return 0" >> TMPCACHE
  30.     print "}" >> TMPCACHE
  31.     print "" >> TMPCACHE
  32. }
  33.  
  34. function print_header1(mtime) {
  35.     print "#*** " MYFILENAME " ***" >> TMPCACHE
  36.     print "" >> TMPCACHE
  37.     print "myservice=\"" MYFILENAME "\"" >> TMPCACHE
  38.     print "myservice=\"${myservice##*/}\"" >> TMPCACHE
  39.     print "echo \"RCSCRIPT ${myservice}\"" >> TMPCACHE
  40.     print "" >> TMPCACHE
  41.     print "echo \"MTIME " mtime "\"" >> TMPCACHE
  42.     print "" >> TMPCACHE
  43. }
  44.  
  45. function print_header2(mtime) {
  46.     print "(" >> TMPCACHE
  47.     print "  # Get settings for rc-script ..." >> TMPCACHE
  48.     print "" >> TMPCACHE
  49.     print "  [ -e \"/etc/conf.d/${myservice}\" ]        && source \"/etc/conf.d/${myservice}\"" >> TMPCACHE
  50.     print "" >> TMPCACHE
  51.     print "  [ -e /etc/conf.d/net ]                   && \\" >> TMPCACHE
  52.     print "  [ \"${myservice%%.*}\" = \"net\" ]           && \\" >> TMPCACHE
  53.     print "  [ \"${myservice##*.}\" != \"${myservice}\" ] && source /etc/conf.d/net" >> TMPCACHE
  54.     print "" >> TMPCACHE
  55.     print "  [ -e /etc/rc.conf ]                      && source /etc/rc.conf" >> TMPCACHE
  56.     print "" >> TMPCACHE
  57.     print "  depend() {" >> TMPCACHE
  58.     print "    return 0" >> TMPCACHE
  59.     print "  }" >> TMPCACHE
  60.     print "" >> TMPCACHE
  61. }
  62.  
  63. function print_end() {
  64.     print "" >> TMPCACHE
  65.     print "  depend" >> TMPCACHE
  66.     print ")" >> TMPCACHE
  67.     print "" >> TMPCACHE
  68. }
  69.  
  70. BEGIN {
  71.  
  72.     extension("/lib/rcscripts/filefuncs.so", "dlload")
  73.  
  74.     # Get our environment variables
  75.     SVCDIR = ENVIRON["SVCDIR"]
  76.     if (SVCDIR == "") {
  77.         eerror("Could not get SVCDIR!")
  78.         exit 1
  79.     }
  80.  
  81.     # Since this could be called more than once simultaneously, use a
  82.     # temporary cache and rename when finished.  See bug 47111
  83.     ("/bin/mktemp "SVCDIR"/depcache.XXXXXXX") | getline TMPCACHE
  84.     if (TMPCACHE == "") {
  85.         eerror("Failed to create temporary cache!")
  86.         exit 1
  87.     }
  88.  
  89.     pipe = "ls /etc/init.d/*"
  90.     while ((pipe | getline tmpstring) > 0)
  91.         scripts = scripts " " tmpstring
  92.     close(pipe)
  93.  
  94.     split(scripts, TMPRCSCRIPTS)
  95.  
  96.     # Make sure that its a file we are working with,
  97.     # and do not process scripts, source or backup files.
  98.     for (x in TMPRCSCRIPTS)
  99.         if (((isfile(TMPRCSCRIPTS[x])) || (islink(TMPRCSCRIPTS[x]))) &&
  100.             (TMPRCSCRIPTS[x] !~ /((\.(c|bak))|\~)$/)) {
  101.  
  102.             RCCOUNT++
  103.  
  104.             RCSCRIPTS[RCCOUNT] = TMPRCSCRIPTS[x]
  105.         }
  106.  
  107.     if (RCCOUNT == 0) {
  108.         eerror("No scripts to process!")
  109.         system("rm -f "TMPCACHE)
  110.         exit 1
  111.     }
  112.  
  113.     print_start()
  114.  
  115.     for (count = 1;count <= RCCOUNT;count++) {
  116.         
  117.         MYFNR = 1
  118.         MYFILENAME = RCSCRIPTS[count]
  119.         STAT_DATA[1] = 1
  120.  
  121.         while (((getline < (RCSCRIPTS[count])) > 0) && (!NEXTFILE)) {
  122.  
  123.             # If line start with a '#' and is the first line
  124.             if (($0 ~ /^[[:space:]]*#/) && (MYFNR == 1)) {
  125.     
  126.                 # Remove any spaces and tabs
  127.                 gsub(/[[:space:]]+/, "")
  128.  
  129.                 if ($0 == "#!/sbin/runscript") {
  130.  
  131.                     if (RCSCRIPTS[count] ~ /\.sh$/) {
  132.  
  133.                         ewarn(RCSCRIPTS[count] " is invalid (should not end with '.sh')")
  134.                         NEXTFILE = 1
  135.                         continue
  136.                     }
  137.  
  138.                     if (stat(MYFILENAME, STAT_DATA) != 0)
  139.                         ewarn("Could not stat \"" MYFILENAME "\"")
  140.                 
  141.                     ISRCSCRIPT = 1
  142.                     print_header1(STAT_DATA["mtime"])
  143.                 } else  {
  144.             
  145.                     NEXTFILE = 1
  146.                     continue
  147.                 }
  148.             }
  149.  
  150.             # Filter out comments and only process if its a rcscript
  151.             if (($0 !~ /^[[:space:]]*#/) && (ISRCSCRIPT)) {
  152.  
  153.                 # If line contain 'depend()', set GOTDEPEND to 1
  154.                 if ($0 ~ /depend[[:space:]]*\(\)/) {
  155.                 
  156.                     GOTDEPEND = 1
  157.  
  158.                     print_header2()
  159.                     print "  # Actual depend() function ..." >> TMPCACHE
  160.                 }
  161.     
  162.                 # We have the depend function...
  163.                 if (GOTDEPEND) {
  164.  
  165.                     # Basic theory is that COUNT will be 0 when we
  166.                     # have matching '{' and '}'
  167.                     COUNT += gsub(/{/, "{")
  168.                     COUNT -= gsub(/}/, "}")
  169.         
  170.                     # This is just to verify that we have started with
  171.                     # the body of depend()
  172.                     SBCOUNT += gsub(/{/, "{")
  173.  
  174.                     # Make sure depend() contain something, else bash
  175.                     # errors out (empty function).
  176.                     if ((SBCOUNT > 0) && (COUNT == 0))
  177.                         print "  \treturn 0" >> TMPCACHE
  178.         
  179.                     # Print the depend() function
  180.                     print "  " $0 >> TMPCACHE
  181.         
  182.                     # If COUNT=0, and SBCOUNT>0, it means we have read
  183.                     # all matching '{' and '}' for depend(), so stop.
  184.                     if ((SBCOUNT > 0) && (COUNT == 0)) {
  185.  
  186.                         GOTDEPEND = 0
  187.                         COUNT = 0
  188.                         SBCOUNT = 0
  189.                         ISRCSCRIPT = 0
  190.  
  191.                         print_end()
  192.                         
  193.                         NEXTFILE = 1
  194.                         continue
  195.                     }
  196.                 }
  197.             }
  198.  
  199.             MYFNR++
  200.         }
  201.  
  202.         close(RCSCRIPTS[count])
  203.  
  204.         NEXTFILE = 0
  205.  
  206.     }
  207.  
  208.     system("mv "TMPCACHE" "SVCDIR"/depcache")
  209. }
  210.  
  211.  
  212. # vim:ts=4
  213.